home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / rbbs / lrge174.zip / RSB5LRGE.MRG < prev   
Text File  |  1992-10-20  |  3KB  |  63 lines

  1. * ------------[ BLED merge (c) Ken Goosens ]-------------
  2. * Merge this against RBBSSUB5.BAS to produce RBBSSUB5.NEW
  3. * RBBSSUB5.BAS:  Date 06-20-1992  Size 116575 bytes
  4. * ------------[ Created 10-20-1992 19:21:40 ]------------
  5. * REPLACING old line(s) by new
  6. 63520 ' $SUBTITLE: 'BinSearch - binary search a file'
  7. ' $PAGE
  8. '
  9. '  NAME    -- BinSearch
  10. '                                  MEANING
  11. '  INPUTS  -- PassedSearchFor$  Value you are looking for
  12. '             StartPos          Starting position of sort key
  13. '             NumChars          # of characters in sort key
  14. '             LenRec            Length of record of data file searching
  15. * ------[ first line different ]------
  16. '             High&             Record # of last record              ' LRGE174/YB102001
  17. '             ZFastTabs$        In a binary integer subfield (2 bytes)
  18. '                                  holds 1st record when might find
  19. '                                  a key beginning with a particular
  20. '                                  character (0-9,A-Z).   Empty if
  21. '                                  no Fast Tab exists for the file.
  22. '
  23. '  OUTPUTS -- RecFoundAt        Record # value found at (0 if none)
  24. '             RecFound$         Full data record when found
  25. '
  26. '  PURPOSE -- Binary searches work file #2 for a key value in a
  27. '             data file that is sorted on a key field
  28. '
  29.       SUB BinSearch (PassedSearchFor$,StartPos, NumChars, LenRec, High&, RecFoundAt&, RecFound$) STATIC ' LRGE174/YB102001
  30.       SearchFor$ = LEFT$(PassedSearchFor$,NumChars)
  31.       SearchFor$ = SearchFor$ + SPACE$(NumChars-LEN(SearchFor$))
  32.       FIELD #2, LenRec AS SearchRec$
  33.       Low& = 0                                                       ' LRGE174/YB102001
  34.       IF LEN(ZFastTabs$) < 72 THEN _
  35.          GOTO 63522
  36.       WasX$ = LEFT$(SearchFor$,1)
  37.       WasX = INSTR("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ",WasX$)
  38.       IF WasX > 0 THEN _
  39.          Low& = CVI(MID$(ZFastTabs$,1+2*(WasX-1),2)) - 1 : _         ' LRGE174/YB102001
  40.          IF WasX < 36 THEN _
  41.             High& = CVI(MID$(ZFastTabs$,1+2*WasX,2))                 ' LRGE174/YB102001
  42. 63522 RecFoundAt& = 0                                                ' LRGE174/YB102001
  43.       IF High& < 1 THEN _                                            ' LRGE174/YB102001
  44.          EXIT SUB
  45.       WasX$ = SPACE$ (NumChars)
  46.       Done = ZFalse
  47.       WHILE NOT Done
  48.          WasI& = INT(((High&/2) + (Low&/2)) + .5)                    ' LRGE174/YB102001
  49.          GET 2, WasI&                                                ' LRGE174/YB102001
  50.          LSET WasX$ = MID$(SearchRec$, StartPos, NumChars)
  51.          IF WasX$ = SearchFor$ THEN _
  52.             RecFound$ = SearchRec$: _
  53.             RecFoundAt& = WasI& : _                                  ' LRGE174/YB102001
  54.             Done = ZTrue _
  55.          ELSE IF (High& - Low&) < 2 THEN _                           ' LRGE174/YB102001
  56.                  Done = ZTrue _
  57.               ELSE IF WasX$ < SearchFor$ THEN _
  58.                       Low& = WasI& _                                 ' LRGE174/YB102001
  59.                    ELSE IF WasX$ > SearchFor$ THEN _
  60.                            High& = WasI&                             ' LRGE174/YB102001
  61.       WEND
  62.       END SUB
  63.